In [1]:
"""環境"""
# .lab

"""更新履歴"""
# 最終更新日:2025/05/21
# 2025/05/21 shutilを使って、cachedirを洗浄することにしました
# 2025/05/15 simple_progress_barおよびdata(dict)を使い始めました。
# 2025/02/25 os.getcwd()を採用し、__file__を定義する必要をなくしました。

"""モジュール読み込み"""
# ファイル操作等
import sys
import os
# from datetime import datetime
from pprint import pprint
import logging
# import pickle
# import struct
from tqdm import tqdm
import h5py
# import threading
import json

# tkinter
from tkinter import filedialog, messagebox, Tk

# データ分析ツール
import pandas as pd
import numpy as np
import scipy as sp
# import math
# from sklearn.linear_model import LinearRegression

# グラフ等作成用
import matplotlib
import matplotlib.pyplot as plt         # 図の作成用
from PIL import Image as im
# import cv2
from IPython.display import display, HTML, clear_output, update_display, Image

# 自作モジュール
sys.path.append(r"C:\Users\okaza\pythonenv")
from modules.Mytools.Tools import print_fileinfo, h5_tree, dict_tree, simple_progress_bar, clean_cache_except_logfiles, get_total_size
import modules.Mytools.Settings
import modules.fitXRD as fx
from modules.peakfit import peakfit, pseudoVoigt

"""ログ管理ツール作成"""
# chche directoryの設定
cachedir = os.path.abspath(os.getcwd() + "/.cache")
clean_cache_except_logfiles(cachedir)
os.makedirs(cachedir, exist_ok=True)

# loggerの作成
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
format = "%(levelname)-9s  %(asctime)s [%(filename)s:%(lineno)d] %(message)s"

# Streamハンドラクラスを作成
sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)
sh.setFormatter(logging.Formatter(format))
logger.addHandler(sh)

# Fileハンドラクラスをインスタンス化
logfile = cachedir + ""
fh = logging.FileHandler(filename=cachedir + "/notebook.log", encoding="utf-8")
fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter(format))
logger.addHandler(fh)
logger.debug("[Activate workspace]: " + os.getcwd())
logger.debug("[Set cache]: "+ os.path.abspath(cachedir))
logger.debug("[Activate log]: " + os.path.abspath(cachedir + "/notebook.log"))

# globalなデータを作成
data = dict()
logger.debug("[Create global variable]: data")
DEBUG      2025-06-27 10:30:06,148 [388102471.py:71] [Activate workspace]: c:\Users\okaza\pythonenv\fpd\fitting_csv
DEBUG      2025-06-27 10:30:06,149 [388102471.py:72] [Set cache]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache
DEBUG      2025-06-27 10:30:06,150 [388102471.py:73] [Activate log]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\notebook.log
DEBUG      2025-06-27 10:30:06,150 [388102471.py:77] [Create global variable]: data

目的¶

csvファイルを読み込んでフィッティングを行います。

1. ファイルの読み込み¶

まずファイルリストを作成します。

In [3]:
def set_filelist():

    # ディレクトリ名を指定
    dir = r"C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv"
    
    # ヘッダーとフッターを指定
    header = "mDIH08_48_"
    footer = ".csv"

    if True: # Main

        # ヘッダーとフッターを含むファイル名を取得
        flist = list()
        for __ in os.listdir(dir):
            if not header in __:
                continue
            if not footer in __:
                continue
            flist.append(__)
        logger.debug("Read filenames")

        # ソート
        flist.sort(key = (lambda x: int(x.replace(header, "").replace(footer, ""))))
        logger.debug("Sort the file name list")

        # 表示
        for f in flist:
            print(os.path.abspath(dir + "/" + f))

        # 格納
        key = sys._getframe().f_code.co_name
        data[key] = dict()
        data[key]["dir"] = dir
        data[key]["flist"] = flist
        data[key]["header"] = header
        data[key]["footer"] = footer
        logger.info("[Add variables]: " + key)
        dict_tree(data)

    return
set_filelist()
del set_filelist
DEBUG      2025-06-27 10:30:48,537 [3435577160.py:20] Read filenames
DEBUG      2025-06-27 10:30:48,538 [3435577160.py:24] Sort the file name list
INFO       2025-06-27 10:30:48,540 [3435577160.py:37] [Add variables]: set_filelist
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_0.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_1.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_2.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_3.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_4.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_5.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_6.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_7.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_8.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_9.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_10.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_11.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_12.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_13.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_14.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_15.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_16.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_17.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_18.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_19.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_20.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_21.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_22.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_23.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_24.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_25.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_26.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_27.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_28.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_29.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_30.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_31.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_32.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_33.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_34.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_35.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_36.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_37.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_38.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_39.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_40.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_41.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_42.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_43.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_44.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_45.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_46.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_47.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_48.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_49.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_50.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_51.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_52.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_53.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_54.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_55.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_56.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_57.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_58.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_59.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_60.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_61.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_62.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_63.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_64.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_65.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_66.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_67.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_68.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_69.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_70.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_71.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_72.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_73.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_74.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_75.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_76.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_77.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_78.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_79.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_80.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_81.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_82.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_83.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_84.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_85.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_86.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_87.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_88.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_89.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_90.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_91.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_92.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_93.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_94.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_95.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_96.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_97.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_98.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_99.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_100.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_101.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_102.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_103.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_104.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_105.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_106.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_107.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_108.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_109.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_110.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_111.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_112.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_113.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_114.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_115.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_116.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_117.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_118.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_119.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_120.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_121.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_122.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_123.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_124.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_125.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_126.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_127.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_128.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_129.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_130.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_131.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_132.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_133.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_134.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_135.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_136.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_137.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_138.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_139.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_140.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_141.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_142.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_143.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_144.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_145.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_146.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_147.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_148.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_149.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_150.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_151.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_152.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_153.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_154.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_155.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_156.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_157.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_158.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_159.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_160.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_161.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_162.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_163.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_164.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_165.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_166.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_167.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_168.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_169.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_170.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_171.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_172.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_173.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_174.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_175.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_176.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_177.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_178.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_179.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_180.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_181.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_182.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_183.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_184.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_185.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_186.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_187.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_188.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_189.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_190.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_191.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_192.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_193.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_194.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_195.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_196.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_197.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_198.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_199.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_200.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_201.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_202.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_203.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_204.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_205.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_206.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_207.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_208.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_209.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_210.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_211.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_212.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_213.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_214.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_215.csv
C:\Users\okaza\Box\DataStrorage\SPring8-2025-04\Okazaki\mDIH07\FPD_4_csv\mDIH08_48_216.csv

└── set_filelist
    ├── dir <class 'str'>
    ├── flist <class 'list'>
    ├── header <class 'str'>
    └── footer <class 'str'>

データを読み込んで、hdfファイルに保存します。

In [4]:
import threading
import concurrent.futures as confu
In [5]:
def convertCSV2HDF():

    """更新履歴
    * 2025/06/25: データの取得方法を変更
    """

    # 変数読み込み
    dir = data["set_filelist"]["dir"]
    flist = data["set_filelist"]["flist"]
    n_frame = len(flist)

    # hdfファイル初期化
    key = sys._getframe().f_code.co_name
    hdffilename = cachedir + "/" + key + ".hdf"
    theta = pd.read_csv(dir + "/" + flist[0], header = None).values.T[0]
    with h5py.File(hdffilename, mode = "w") as f:
        f.create_dataset(
            name = "2theta",
            data = theta,
            shape = theta.shape,
            dtype = theta.dtype
        )
        g = f.create_group(
            name = "intensity"
        )
        for i in tqdm(range(n_frame)):
            g.create_dataset(
                name = "frame = {}".format(i),
                shape = theta.shape,
                dtype = theta.dtype
            )
    
    # lock
    lock = threading.Lock()

    # 演算
    with confu.ThreadPoolExecutor(max_workers=os.cpu_count()) as tpe:
        
        # 演算開始
        futures = [
            tpe.submit(
                lambda filename: (
                    int(os.path.splitext(filename)[0].replace(data["set_filelist"]["header"], "").replace(data["set_filelist"]["footer"], "")),
                    pd.read_csv(dir + "/" + filename, header = None).values.T[1]),
                filename
            ) for filename in flist
        ]

        # 終わったプロセスから順に出力
        for i, future in enumerate(confu.as_completed(futures)):
            intensity = future.result()
            with lock:
                j = intensity[0]
                with h5py.File(hdffilename, mode = "r+") as f:
                    f["intensity"]["frame = {}".format(j)][:] = intensity[1] # type: ignore
            simple_progress_bar(i+1, n_frame)

    # 表示
    data[key] = dict()
    data[key]["hdf"] = hdffilename
    logger.info("[Add variables]: " + key)
    with h5py.File(hdffilename, mode = "r") as f:
        h5_tree(f)
    

    return
convertCSV2HDF()
del convertCSV2HDF
100%|██████████| 217/217 [00:00<00:00, 50519.76it/s]
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■--]  97% (211/217) 
INFO       2025-06-27 10:30:57,380 [1221129909.py:61] [Add variables]: convertCSV2HDF
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■] 100% (217/217) 
<HDF5 file "convertCSV2HDF.hdf" (mode r)>
├── 2theta ((3800,), float64)
└── intensity
    ├── frame = 0 ((3800,), float64)
    ├── frame = 1 ((3800,), float64)
    ├── frame = 10 ((3800,), float64)
    ├── frame = 100 ((3800,), float64)
    ├── frame = 101 ((3800,), float64)
    ├── frame = 102 ((3800,), float64)
    ├── frame = 103 ((3800,), float64)
    ├── frame = 104 ((3800,), float64)
    ├── frame = 105 ((3800,), float64)
    ├── frame = 106 ((3800,), float64)
    ├── frame = 107 ((3800,), float64)
    ├── frame = 108 ((3800,), float64)
    ├── frame = 109 ((3800,), float64)
    ├── frame = 11 ((3800,), float64)
    ├── frame = 110 ((3800,), float64)
    ├── frame = 111 ((3800,), float64)
    ├── frame = 112 ((3800,), float64)
    ├── frame = 113 ((3800,), float64)
    ├── frame = 114 ((3800,), float64)
    ├── frame = 115 ((3800,), float64)
    ├── frame = 116 ((3800,), float64)
    ├── frame = 117 ((3800,), float64)
    ├── frame = 118 ((3800,), float64)
    ├── frame = 119 ((3800,), float64)
    ├── frame = 12 ((3800,), float64)
    ├── frame = 120 ((3800,), float64)
    ├── frame = 121 ((3800,), float64)
    ├── frame = 122 ((3800,), float64)
    ├── frame = 123 ((3800,), float64)
    ├── frame = 124 ((3800,), float64)
    ├── frame = 125 ((3800,), float64)
    ├── frame = 126 ((3800,), float64)
    ├── frame = 127 ((3800,), float64)
    ├── frame = 128 ((3800,), float64)
    ├── frame = 129 ((3800,), float64)
    ├── frame = 13 ((3800,), float64)
    ├── frame = 130 ((3800,), float64)
    ├── frame = 131 ((3800,), float64)
    ├── frame = 132 ((3800,), float64)
    ├── frame = 133 ((3800,), float64)
    ├── frame = 134 ((3800,), float64)
    ├── frame = 135 ((3800,), float64)
    ├── frame = 136 ((3800,), float64)
    ├── frame = 137 ((3800,), float64)
    ├── frame = 138 ((3800,), float64)
    ├── frame = 139 ((3800,), float64)
    ├── frame = 14 ((3800,), float64)
    ├── frame = 140 ((3800,), float64)
    ├── frame = 141 ((3800,), float64)
    ├── frame = 142 ((3800,), float64)
    ├── frame = 143 ((3800,), float64)
    ├── frame = 144 ((3800,), float64)
    ├── frame = 145 ((3800,), float64)
    ├── frame = 146 ((3800,), float64)
    ├── frame = 147 ((3800,), float64)
    ├── frame = 148 ((3800,), float64)
    ├── frame = 149 ((3800,), float64)
    ├── frame = 15 ((3800,), float64)
    ├── frame = 150 ((3800,), float64)
    ├── frame = 151 ((3800,), float64)
    ├── frame = 152 ((3800,), float64)
    ├── frame = 153 ((3800,), float64)
    ├── frame = 154 ((3800,), float64)
    ├── frame = 155 ((3800,), float64)
    ├── frame = 156 ((3800,), float64)
    ├── frame = 157 ((3800,), float64)
    ├── frame = 158 ((3800,), float64)
    ├── frame = 159 ((3800,), float64)
    ├── frame = 16 ((3800,), float64)
    ├── frame = 160 ((3800,), float64)
    ├── frame = 161 ((3800,), float64)
    ├── frame = 162 ((3800,), float64)
    ├── frame = 163 ((3800,), float64)
    ├── frame = 164 ((3800,), float64)
    ├── frame = 165 ((3800,), float64)
    ├── frame = 166 ((3800,), float64)
    ├── frame = 167 ((3800,), float64)
    ├── frame = 168 ((3800,), float64)
    ├── frame = 169 ((3800,), float64)
    ├── frame = 17 ((3800,), float64)
    ├── frame = 170 ((3800,), float64)
    ├── frame = 171 ((3800,), float64)
    ├── frame = 172 ((3800,), float64)
    ├── frame = 173 ((3800,), float64)
    ├── frame = 174 ((3800,), float64)
    ├── frame = 175 ((3800,), float64)
    ├── frame = 176 ((3800,), float64)
    ├── frame = 177 ((3800,), float64)
    ├── frame = 178 ((3800,), float64)
    ├── frame = 179 ((3800,), float64)
    ├── frame = 18 ((3800,), float64)
    ├── frame = 180 ((3800,), float64)
    ├── frame = 181 ((3800,), float64)
    ├── frame = 182 ((3800,), float64)
    ├── frame = 183 ((3800,), float64)
    ├── frame = 184 ((3800,), float64)
    ├── frame = 185 ((3800,), float64)
    ├── frame = 186 ((3800,), float64)
    ├── frame = 187 ((3800,), float64)
    ├── frame = 188 ((3800,), float64)
    ├── frame = 189 ((3800,), float64)
    ├── frame = 19 ((3800,), float64)
    ├── frame = 190 ((3800,), float64)
    ├── frame = 191 ((3800,), float64)
    ├── frame = 192 ((3800,), float64)
    ├── frame = 193 ((3800,), float64)
    ├── frame = 194 ((3800,), float64)
    ├── frame = 195 ((3800,), float64)
    ├── frame = 196 ((3800,), float64)
    ├── frame = 197 ((3800,), float64)
    ├── frame = 198 ((3800,), float64)
    ├── frame = 199 ((3800,), float64)
    ├── frame = 2 ((3800,), float64)
    ├── frame = 20 ((3800,), float64)
    ├── frame = 200 ((3800,), float64)
    ├── frame = 201 ((3800,), float64)
    ├── frame = 202 ((3800,), float64)
    ├── frame = 203 ((3800,), float64)
    ├── frame = 204 ((3800,), float64)
    ├── frame = 205 ((3800,), float64)
    ├── frame = 206 ((3800,), float64)
    ├── frame = 207 ((3800,), float64)
    ├── frame = 208 ((3800,), float64)
    ├── frame = 209 ((3800,), float64)
    ├── frame = 21 ((3800,), float64)
    ├── frame = 210 ((3800,), float64)
    ├── frame = 211 ((3800,), float64)
    ├── frame = 212 ((3800,), float64)
    ├── frame = 213 ((3800,), float64)
    ├── frame = 214 ((3800,), float64)
    ├── frame = 215 ((3800,), float64)
    ├── frame = 216 ((3800,), float64)
    ├── frame = 22 ((3800,), float64)
    ├── frame = 23 ((3800,), float64)
    ├── frame = 24 ((3800,), float64)
    ├── frame = 25 ((3800,), float64)
    ├── frame = 26 ((3800,), float64)
    ├── frame = 27 ((3800,), float64)
    ├── frame = 28 ((3800,), float64)
    ├── frame = 29 ((3800,), float64)
    ├── frame = 3 ((3800,), float64)
    ├── frame = 30 ((3800,), float64)
    ├── frame = 31 ((3800,), float64)
    ├── frame = 32 ((3800,), float64)
    ├── frame = 33 ((3800,), float64)
    ├── frame = 34 ((3800,), float64)
    ├── frame = 35 ((3800,), float64)
    ├── frame = 36 ((3800,), float64)
    ├── frame = 37 ((3800,), float64)
    ├── frame = 38 ((3800,), float64)
    ├── frame = 39 ((3800,), float64)
    ├── frame = 4 ((3800,), float64)
    ├── frame = 40 ((3800,), float64)
    ├── frame = 41 ((3800,), float64)
    ├── frame = 42 ((3800,), float64)
    ├── frame = 43 ((3800,), float64)
    ├── frame = 44 ((3800,), float64)
    ├── frame = 45 ((3800,), float64)
    ├── frame = 46 ((3800,), float64)
    ├── frame = 47 ((3800,), float64)
    ├── frame = 48 ((3800,), float64)
    ├── frame = 49 ((3800,), float64)
    ├── frame = 5 ((3800,), float64)
    ├── frame = 50 ((3800,), float64)
    ├── frame = 51 ((3800,), float64)
    ├── frame = 52 ((3800,), float64)
    ├── frame = 53 ((3800,), float64)
    ├── frame = 54 ((3800,), float64)
    ├── frame = 55 ((3800,), float64)
    ├── frame = 56 ((3800,), float64)
    ├── frame = 57 ((3800,), float64)
    ├── frame = 58 ((3800,), float64)
    ├── frame = 59 ((3800,), float64)
    ├── frame = 6 ((3800,), float64)
    ├── frame = 60 ((3800,), float64)
    ├── frame = 61 ((3800,), float64)
    ├── frame = 62 ((3800,), float64)
    ├── frame = 63 ((3800,), float64)
    ├── frame = 64 ((3800,), float64)
    ├── frame = 65 ((3800,), float64)
    ├── frame = 66 ((3800,), float64)
    ├── frame = 67 ((3800,), float64)
    ├── frame = 68 ((3800,), float64)
    ├── frame = 69 ((3800,), float64)
    ├── frame = 7 ((3800,), float64)
    ├── frame = 70 ((3800,), float64)
    ├── frame = 71 ((3800,), float64)
    ├── frame = 72 ((3800,), float64)
    ├── frame = 73 ((3800,), float64)
    ├── frame = 74 ((3800,), float64)
    ├── frame = 75 ((3800,), float64)
    ├── frame = 76 ((3800,), float64)
    ├── frame = 77 ((3800,), float64)
    ├── frame = 78 ((3800,), float64)
    ├── frame = 79 ((3800,), float64)
    ├── frame = 8 ((3800,), float64)
    ├── frame = 80 ((3800,), float64)
    ├── frame = 81 ((3800,), float64)
    ├── frame = 82 ((3800,), float64)
    ├── frame = 83 ((3800,), float64)
    ├── frame = 84 ((3800,), float64)
    ├── frame = 85 ((3800,), float64)
    ├── frame = 86 ((3800,), float64)
    ├── frame = 87 ((3800,), float64)
    ├── frame = 88 ((3800,), float64)
    ├── frame = 89 ((3800,), float64)
    ├── frame = 9 ((3800,), float64)
    ├── frame = 90 ((3800,), float64)
    ├── frame = 91 ((3800,), float64)
    ├── frame = 92 ((3800,), float64)
    ├── frame = 93 ((3800,), float64)
    ├── frame = 94 ((3800,), float64)
    ├── frame = 95 ((3800,), float64)
    ├── frame = 96 ((3800,), float64)
    ├── frame = 97 ((3800,), float64)
    ├── frame = 98 ((3800,), float64)
    └── frame = 99 ((3800,), float64)

2. 全データの可視化¶

1次元データを線画で表示します。

In [6]:
def plot_profile():

    # profileの間隔
    aset = 4

    # x軸の範囲
    theta_range = (5, 30)

    if True: # Main

        # flag処理
        if True:
            try:
                theta_range # type: ignore
            except:
                theta_range = None
                switch_theta_range = False
            else:
                switch_theta_range = True

        # figureを作成
        fig, ax = plt.subplots()
        fig.set_size_inches((6,4.5))
        fig.set_dpi(300)
        fig.subplots_adjust(
            left = 0.08,
            right = 0.92,
            bottom = 0.08,
            top = 0.92
        )

        # xデータを読み込み(共通)
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        if switch_theta_range:
            mask[theta<theta_range[0]] = False # type: ignore
            mask[theta>theta_range[1]] = False # type: ignore
        
        # axを構成
        ax.set_xlabel("2theta [degree]", fontsize = 10)
        ax.autoscale(tight = True)
        if switch_theta_range:
            ax.set_xlim(*theta_range) # type: ignore
        else:
            ax.set_xlim(theta[0], theta[-1])

        # すべてプロットする
        n_frame = len(data["set_filelist"]["flist"])
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensity = np.array(f["intensity"]["frame = {}".format(i)][()]) # type: ignore
                ax.plot(
                    theta[mask],
                    (intensity + i*aset)[mask],
                    lw = 0.1,
                    c = "0"
                )
                simple_progress_bar(i+1, n_frame)    

        # 画像の表示
        fig.canvas.draw()
        img = im.frombuffer(
            mode = "RGBA",
            size = fig.canvas.get_width_height(),
            data = fig.canvas.buffer_rgba(), # type: ignore
            decoder_name = "raw"
        )
        key = sys._getframe().f_code.co_name
        imgfilename = cachedir + "/{}.png".format(key)
        img.save(imgfilename)
        logger.debug("[Save fig]: " + os.path.abspath(imgfilename))        
        pdffilename = cachedir + "/{}.pdf".format(key)
        plt.savefig(pdffilename)
        logger.debug("[Save fig]: " + os.path.abspath(pdffilename))
        plt.close()
        display(Image(filename = imgfilename, width = 600))

    return
plot_profile()
del plot_profile
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■] 100% (217/217) 
DEBUG      2025-06-27 10:31:02,090 [123556372.py:74] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\plot_profile.png
DEBUG      2025-06-27 10:31:02,629 [123556372.py:77] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\plot_profile.pdf
No description has been provided for this image
In [7]:
def imshow_profile():

    # log形式?
    # flag_log = True

    # x軸の範囲
    theta_range = (11.3,12.3)

    # figureのサイズ
    size_inches = (3, 4.5)

    if True: # Main

        # flag処理
        if True:
            # flag_log
            try:
                flag_log # type: ignore
            except NameError:
                flag_log = False

        # figureを作成
        fig, ax = plt.subplots()
        fig.set_size_inches(size_inches)
        fig.set_dpi(300)
        fig.subplots_adjust(
            left = 0.08,
            right = 0.92,
            bottom = 0.08,
            top = 0.92
        )

        # xデータを読み込み(共通)
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # axを構成
        ax.set_xlabel("2theta [degree]", fontsize = 10)
        try:
            theta_range # type: ignore
        except:
            theta_range = (theta[0], theta[-1])
        ax.set_xlim(*theta_range) # type: ignore
        
        # 強度データを取得
        n_frame = len(data["set_filelist"]["flist"])
        intensities = list()
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensities.append(np.array(f["intensity"]["frame = {}".format(i)][()])) # type: ignore
        intensities = np.vstack(intensities)

        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta<theta_range[0]] = False # type: ignore
        mask[theta>theta_range[1]] = False # type: ignore

        # imshow
        if flag_log:
            ax.imshow(
                np.log(intensities),
                aspect = "auto",
                extent = (theta[0], theta[-1], 0, n_frame), # type: ignore
                cmap = "grey",
                origin = "lower",
                vmax = np.max(intensities.T[mask].T),
                vmin = np.min(intensities.T[mask].T),
            )
        else:
            ax.imshow(
                intensities,
                aspect = "auto",
                extent = (theta[0], theta[-1], 0, n_frame), # type: ignore
                cmap = "grey",
                origin = "lower",
                vmax = np.max(intensities.T[mask].T),
                vmin = np.min(intensities.T[mask].T),
            )

        # 画像の表示
        fig.canvas.draw()
        img = im.frombuffer(
            mode = "RGBA",
            size = fig.canvas.get_width_height(),
            data = fig.canvas.buffer_rgba(), # type: ignore
            decoder_name = "raw"
        )
        plt.close()
        key = sys._getframe().f_code.co_name
        imgfilename = cachedir + "/{}.png".format(key)
        img.save(imgfilename)
        logger.debug("[Save fig]: " + os.path.abspath(imgfilename))
        display(Image(filename = imgfilename, width = size_inches[0]*100))

    return
imshow_profile()
del imshow_profile
DEBUG      2025-06-27 10:31:11,442 [2421345399.py:92] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\imshow_profile.png
No description has been provided for this image

3. フィッティング¶

In [8]:
from modules.peakfit import peakfit, pseudoVoigt
import matplotlib.animation as anim

KCl110¶

フィッティング範囲を絞ります。

In [11]:
def set_fitlim():

    # ピーク名
    peakname = "KCl110"

    # profileの間隔
    aset = 1

    # x軸の範囲
    theta_range = (10.3,11.3)

    # fittingする範囲
    fit_range = (10.8, 11.1)

    # グラフのサイズ
    size_inches = (3,5)

    if True: # Main

        # figureを作成
        fig, ax = plt.subplots()
        fig.set_size_inches(size_inches)
        fig.set_dpi(300)
        fig.subplots_adjust(
            left = 0.08,
            right = 0.92,
            bottom = 0.08,
            top = 0.92
        )

        # xデータを読み込み(共通)
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta < theta_range[0]] = False
        mask[theta > theta_range[1]] = False
        fitmask = np.ones(theta.shape).astype(np.bool_)
        fitmask[theta < fit_range[0]] = False
        fitmask[theta > fit_range[1]] = False

        # すべてプロットする
        n_frame = len(data["set_filelist"]["flist"])
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensity = np.array(f["intensity"]["frame = {}".format(i)][()]) # type: ignore
                ax.plot(
                    theta[mask],
                    (intensity + i*aset)[mask],
                    lw = 0.1,
                    c = "0"
                )
                ax.plot(
                    theta[fitmask],
                    (intensity + i*aset)[fitmask],
                    lw = 0.1,
                    c = "tab:orange"
                )
                simple_progress_bar(i+1, n_frame)

        # axを構成
        ax.set_xlabel("2theta [degree]", fontsize = 10)
        ax.autoscale(tight = True)
        ax.set_xlim(*theta_range) # type: ignore
        ylim = ax.get_ylim()

        # 画像の表示
        fig.canvas.draw()
        img = im.frombuffer(
            mode = "RGBA",
            size = fig.canvas.get_width_height(),
            data = fig.canvas.buffer_rgba(), # type: ignore
            decoder_name = "raw"
        )
        os.makedirs(cachedir + "/{}".format(peakname), exist_ok=True)
        key = sys._getframe().f_code.co_name
        imgfilename = cachedir + "/{}/{}.png".format(peakname, key)
        img.save(imgfilename)
        logger.debug("[Save fig]: " + os.path.abspath(imgfilename))
        pdffilename = cachedir + "/{}/{}.pdf".format(peakname, key)
        plt.savefig(pdffilename)
        logger.debug("[Save fig]: " + os.path.abspath(pdffilename))
        plt.close()
        display(Image(filename = imgfilename, width = size_inches[0]*100))

        # データ格納
        if not key in data.keys():
            data[key] = dict()
        data[key][peakname] = dict()
        data[key][peakname]["theta_range"] = theta_range
        data[key][peakname]["aset"] = aset
        data[key][peakname]["size_inches"] = size_inches
        data[key][peakname]["fit_range"] = fit_range
        data[key][peakname]["ylim"] = ylim
        logger.info("[Add variables]: {}/{}".format(key, peakname))
        dict_tree(data)

    return
set_fitlim()
del set_fitlim
DEBUG      2025-06-27 10:31:51,924 [2156996311.py:80] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\KCl110\set_fitlim.png
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■] 100% (217/217) 
DEBUG      2025-06-27 10:31:52,091 [2156996311.py:83] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\KCl110\set_fitlim.pdf
No description has been provided for this image
INFO       2025-06-27 10:31:52,105 [2156996311.py:96] [Add variables]: set_fitlim/KCl110
├── set_filelist
│   ├── dir <class 'str'>
│   ├── flist <class 'list'>
│   ├── header <class 'str'>
│   └── footer <class 'str'>
├── convertCSV2HDF
│   └── hdf <class 'str'>
└── set_fitlim
    └── KCl110
        ├── theta_range <class 'tuple'>
        ├── aset <class 'int'>
        ├── size_inches <class 'tuple'>
        ├── fit_range <class 'tuple'>
        └── ylim <class 'tuple'>
In [13]:
def autofit():

    peakname = "KCl110"

    if True: # Main
        # 角度データを読み込み
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # 強度データを取得
        n_frame = len(data["set_filelist"]["flist"])
        intensities = list()
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensities.append(np.array(f["intensity"]["frame = {}".format(i)][()])) # type: ignore
        intensities = np.vstack(intensities)

        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta < data["set_fitlim"][peakname]["fit_range"][0]] = False
        mask[theta > data["set_fitlim"][peakname]["fit_range"][1]] = False
        theta_fit = theta[mask]
        intensities_fit = intensities.T[mask].T

        # 出力格納用変数を定義
        res = [None]*n_frame

        # フィット用関数を定義
        pf = peakfit()
        def process(i):
            _res = pf.fit_Vigot_func(theta = theta_fit, intensity = intensities_fit[i])
            res_dict = dict()
            for j, k in enumerate(["popt", "pcov"]):
                res_dict[k] = dict()
                for l, m in enumerate(pf.variables(nop = 1)):
                    res_dict[k][m] = _res[j][l]
            res_dict["r2"] = _res[2]
            return i, res_dict

        # マルチスレッドを使いながら演算
        with confu.ThreadPoolExecutor() as tpe:
            futures = [tpe.submit(process, i_frame) for i_frame in np.arange(n_frame)]
            for i, future in enumerate(confu.as_completed(futures)):
                i_frame, val = future.result()
                res[i_frame] = val # type: ignore
                simple_progress_bar(i+1, n_frame)
        
        # データ格納
        key = sys._getframe().f_code.co_name
        if not key in data.keys():
            data[key] = dict()
        data[key][peakname] = dict()
        data[key][peakname]["res"] = res
        logger.debug("[Add variable]: " + peakname + "/res")
        logger.info("size of data: {} MB".format(sys.getsizeof(data)%1024%1024))

        # データ保存
        os.makedirs(cachedir + "/" + peakname, exist_ok=True)
        jsonfile = cachedir + "/{}/{}.json".format(peakname, key)
        with open(jsonfile, mode = "w") as f:
            json.dump(res, f, indent = 4)
        logger.info("[Save json]: " + os.path.abspath(jsonfile))
        dict_tree(data)

    return
autofit()
del autofit
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■-]  99% (214/217) 
DEBUG      2025-06-27 10:33:02,158 [788653478.py:54] [Add variable]: KCl110/res
INFO       2025-06-27 10:33:02,158 [788653478.py:55] size of data: 184 MB
INFO       2025-06-27 10:33:02,164 [788653478.py:62] [Save json]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\KCl110\autofit.json
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■] 100% (217/217) 

├── set_filelist
│   ├── dir <class 'str'>
│   ├── flist <class 'list'>
│   ├── header <class 'str'>
│   └── footer <class 'str'>
├── convertCSV2HDF
│   └── hdf <class 'str'>
├── set_fitlim
│   └── KCl110
│       ├── theta_range <class 'tuple'>
│       ├── aset <class 'int'>
│       ├── size_inches <class 'tuple'>
│       ├── fit_range <class 'tuple'>
│       └── ylim <class 'tuple'>
└── autofit
    └── KCl110
        └── res <class 'list'>

フィッティング結果を出力します。

In [14]:
def plot_res():

    peakname = "KCl110"

    if True: # Main

        # 変数を読み込み
        theta_range = data["set_fitlim"][peakname]["theta_range"]
        fit_range = data["set_fitlim"][peakname]["fit_range"]
        aset = data["set_fitlim"][peakname]["aset"]
        size_inches = data["set_fitlim"][peakname]["size_inches"]
        ylim = data["set_fitlim"][peakname]["ylim"]

        # figureを作成
        fig, ax = plt.subplots()
        fig.set_size_inches(size_inches)
        fig.set_dpi(300)
        fig.subplots_adjust(
            left = 0.08,
            right = 0.92,
            bottom = 0.08,
            top = 0.92
        )

        # xデータを読み込み(共通)
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta < theta_range[0]] = False
        mask[theta > theta_range[1]] = False
        fitmask = np.ones(theta.shape).astype(np.bool_)
        fitmask[theta < fit_range[0]] = False
        fitmask[theta > fit_range[1]] = False

        # すべてプロットする
        n_frame = len(data["set_filelist"]["flist"])
        pf = peakfit()
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensity = np.array(f["intensity"]["frame = {}".format(i)][()]) # type: ignore
                ax.plot(
                    theta[mask],
                    (intensity + i*aset)[mask],
                    lw = 0.1,
                    c = "0"
                )
                x = np.linspace(theta[fitmask][0], theta[fitmask][-1], 200)
                y: np.ndarray = pseudoVoigt(
                    x,
                    *[data["autofit"][peakname]["res"][i]["popt"][j] for j in pf.variables()]
                ) # type: ignore
                ax.plot(
                    x,
                    y + i*aset,
                    lw = 0.1,
                    c = "tab:orange"
                )
                ax.plot(
                    [data["autofit"][peakname]["res"][i]["popt"]["mu"]],
                    [
                        data["autofit"][peakname]["res"][i]["popt"]["amp"]
                        + data["autofit"][peakname]["res"][i]["popt"]["b0"]
                        + data["autofit"][peakname]["res"][i]["popt"]["b1"] * data["autofit"][peakname]["res"][i]["popt"]["mu"]
                        + i*aset
                    ],
                    lw = 0,
                    marker = "o",
                    ms = 1,
                    mec = "tab:orange",
                    c = "1",
                    mew = 0.1
                )
                simple_progress_bar(i+1, n_frame)

        # axを構成
        ax.set_xlabel("2theta [degree]", fontsize = 10)
        ax.autoscale(tight = True)
        ax.set_xlim(*theta_range) # type: ignore
        ax.set_ylim(ylim)

        # 画像の表示
        fig.canvas.draw()
        img = im.frombuffer(
            mode = "RGBA",
            size = fig.canvas.get_width_height(),
            data = fig.canvas.buffer_rgba(), # type: ignore
            decoder_name = "raw"
        )
        os.makedirs(cachedir + "/" + peakname, exist_ok=True)
        key = sys._getframe().f_code.co_name
        imgfilename = cachedir + "/{}/{}.png".format(peakname, key)
        img.save(imgfilename)
        logger.debug("[Save fig]: " + os.path.abspath(imgfilename))
        pdffilename = cachedir + "/{}/{}.pdf".format(peakname, key)
        plt.savefig(pdffilename)
        logger.debug("[Save fig]: " + os.path.abspath(pdffilename))
        plt.close()
        display(Image(filename = imgfilename, width = size_inches[0]*100))

    return
plot_res()
del plot_res
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■] 100% (217/217) 
DEBUG      2025-06-27 10:33:03,006 [4256538023.py:95] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\KCl110\plot_res.png
DEBUG      2025-06-27 10:33:03,227 [4256538023.py:98] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\KCl110\plot_res.pdf
No description has been provided for this image

FeH111¶

フィッティング範囲を絞ります。

In [16]:
def set_fitlim():

    # ピーク名
    peakname = "FeH111"

    # profileの間隔
    aset = 0.1

    # x軸の範囲
    theta_range = (11.2, 12.5)

    # fittingする範囲
    fit_range = (11.5, 11.85)

    # グラフのサイズ
    size_inches = (3,5)

    if True: # Main

        # figureを作成
        fig, ax = plt.subplots()
        fig.set_size_inches(size_inches)
        fig.set_dpi(300)
        fig.subplots_adjust(
            left = 0.08,
            right = 0.92,
            bottom = 0.08,
            top = 0.92
        )

        # xデータを読み込み(共通)
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta < theta_range[0]] = False
        mask[theta > theta_range[1]] = False
        fitmask = np.ones(theta.shape).astype(np.bool_)
        fitmask[theta < fit_range[0]] = False
        fitmask[theta > fit_range[1]] = False

        # すべてプロットする
        n_frame = len(data["set_filelist"]["flist"])
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensity = np.array(f["intensity"]["frame = {}".format(i)][()]) # type: ignore
                ax.plot(
                    theta[mask],
                    (intensity + i*aset)[mask],
                    lw = 0.1,
                    c = "0"
                )
                ax.plot(
                    theta[fitmask],
                    (intensity + i*aset)[fitmask],
                    lw = 0.1,
                    c = "tab:orange"
                )
                simple_progress_bar(i+1, n_frame)

        # axを構成
        ax.set_xlabel("2theta [degree]", fontsize = 10)
        ax.autoscale(tight = True)
        ax.set_xlim(*theta_range) # type: ignore
        ylim = ax.get_ylim()

        # 画像の表示
        fig.canvas.draw()
        img = im.frombuffer(
            mode = "RGBA",
            size = fig.canvas.get_width_height(),
            data = fig.canvas.buffer_rgba(), # type: ignore
            decoder_name = "raw"
        )
        os.makedirs(cachedir + "/{}".format(peakname), exist_ok=True)
        key = sys._getframe().f_code.co_name
        imgfilename = cachedir + "/{}/{}.png".format(peakname, key)
        img.save(imgfilename)
        logger.debug("[Save fig]: " + os.path.abspath(imgfilename))
        pdffilename = cachedir + "/{}/{}.pdf".format(peakname, key)
        plt.savefig(pdffilename)
        logger.debug("[Save fig]: " + os.path.abspath(pdffilename))
        plt.close()
        display(Image(filename = imgfilename, width = size_inches[0]*100))

        # データ格納
        if not key in data.keys():
            data[key] = dict()
        data[key][peakname] = dict()
        data[key][peakname]["theta_range"] = theta_range
        data[key][peakname]["aset"] = aset
        data[key][peakname]["size_inches"] = size_inches
        data[key][peakname]["fit_range"] = fit_range
        data[key][peakname]["ylim"] = ylim
        logger.info("[Add variables]: {}/{}".format(key, peakname))
        dict_tree(data)

    return
set_fitlim()
del set_fitlim
DEBUG      2025-06-27 10:33:57,504 [168385374.py:80] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\FeH111\set_fitlim.png
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■] 100% (217/217) 
DEBUG      2025-06-27 10:33:57,692 [168385374.py:83] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\FeH111\set_fitlim.pdf
No description has been provided for this image
INFO       2025-06-27 10:33:57,705 [168385374.py:96] [Add variables]: set_fitlim/FeH111
├── set_filelist
│   ├── dir <class 'str'>
│   ├── flist <class 'list'>
│   ├── header <class 'str'>
│   └── footer <class 'str'>
├── convertCSV2HDF
│   └── hdf <class 'str'>
├── set_fitlim
│   ├── KCl110
│   │   ├── theta_range <class 'tuple'>
│   │   ├── aset <class 'int'>
│   │   ├── size_inches <class 'tuple'>
│   │   ├── fit_range <class 'tuple'>
│   │   └── ylim <class 'tuple'>
│   └── FeH111
│       ├── theta_range <class 'tuple'>
│       ├── aset <class 'float'>
│       ├── size_inches <class 'tuple'>
│       ├── fit_range <class 'tuple'>
│       └── ylim <class 'tuple'>
└── autofit
    └── KCl110
        └── res <class 'list'>
In [17]:
def autofit():

    peakname = "FeH111"

    if True: # Main
        # 角度データを読み込み
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # 強度データを取得
        n_frame = len(data["set_filelist"]["flist"])
        intensities = list()
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensities.append(np.array(f["intensity"]["frame = {}".format(i)][()])) # type: ignore
        intensities = np.vstack(intensities)

        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta < data["set_fitlim"][peakname]["fit_range"][0]] = False
        mask[theta > data["set_fitlim"][peakname]["fit_range"][1]] = False
        theta_fit = theta[mask]
        intensities_fit = intensities.T[mask].T

        # 出力格納用変数を定義
        res = [None]*n_frame

        # フィット用関数を定義
        pf = peakfit()
        def process(i):
            initparam = pf.calc_init(
                theta = theta_fit,
                intensity = intensities_fit[i]
            )
            initparam[1] = 11.7
            _res = pf.fit_Vigot_func(
                theta = theta_fit,
                intensity = intensities_fit[i],
                initparams = initparam
            )
            res_dict = dict()
            for j, k in enumerate(["popt", "pcov"]):
                res_dict[k] = dict()
                for l, m in enumerate(pf.variables(nop = 1)):
                    res_dict[k][m] = _res[j][l]
            res_dict["r2"] = _res[2]
            return i, res_dict

        # マルチスレッドを使いながら演算
        with confu.ThreadPoolExecutor() as tpe:
            futures = [tpe.submit(process, i_frame) for i_frame in np.arange(n_frame)]
            for i, future in enumerate(confu.as_completed(futures)):
                i_frame, val = future.result()
                res[i_frame] = val # type: ignore
                simple_progress_bar(i+1, n_frame)
        
        # データ格納
        key = sys._getframe().f_code.co_name
        if not key in data.keys():
            data[key] = dict()
        data[key][peakname] = dict()
        data[key][peakname]["res"] = res
        logger.debug("[Add variable]: " + peakname + "/res")
        logger.info("size of data: {} MB".format(sys.getsizeof(data)%1024%1024))

        # データ保存
        os.makedirs(cachedir + "/" + peakname, exist_ok=True)
        jsonfile = cachedir + "/{}/{}.json".format(peakname, key)
        with open(jsonfile, mode = "w") as f:
            json.dump(res, f, indent = 4)
        logger.info("[Save json]: " + os.path.abspath(jsonfile))
        dict_tree(data)

    return
autofit()
del autofit
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■-]  98% (212/217) 
C:\Users\okaza\pythonenv\modules\peakfit.py:178: RuntimeWarning: divide by zero encountered in divide
  l = 1/(1+np.power((x-mu)/gamma, 2))
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■-]  98% (213/217) 
C:\Users\okaza\pythonenv\modules\peakfit.py:177: RuntimeWarning: divide by zero encountered in divide
  g = np.exp(-np.power(x-mu, 2)/2/np.power(sigma,2))
DEBUG      2025-06-27 10:34:18,358 [2169881763.py:63] [Add variable]: FeH111/res
INFO       2025-06-27 10:34:18,358 [2169881763.py:64] size of data: 184 MB
INFO       2025-06-27 10:34:18,364 [2169881763.py:71] [Save json]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\FeH111\autofit.json
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■] 100% (217/217) 

├── set_filelist
│   ├── dir <class 'str'>
│   ├── flist <class 'list'>
│   ├── header <class 'str'>
│   └── footer <class 'str'>
├── convertCSV2HDF
│   └── hdf <class 'str'>
├── set_fitlim
│   ├── KCl110
│   │   ├── theta_range <class 'tuple'>
│   │   ├── aset <class 'int'>
│   │   ├── size_inches <class 'tuple'>
│   │   ├── fit_range <class 'tuple'>
│   │   └── ylim <class 'tuple'>
│   └── FeH111
│       ├── theta_range <class 'tuple'>
│       ├── aset <class 'float'>
│       ├── size_inches <class 'tuple'>
│       ├── fit_range <class 'tuple'>
│       └── ylim <class 'tuple'>
└── autofit
    ├── KCl110
    │   └── res <class 'list'>
    └── FeH111
        └── res <class 'list'>

フィッティング結果を出力します。

In [18]:
def plot_res():

    peakname = "FeH111"

    if True: # Main

        # 変数を読み込み
        theta_range = data["set_fitlim"][peakname]["theta_range"]
        fit_range = data["set_fitlim"][peakname]["fit_range"]
        aset = data["set_fitlim"][peakname]["aset"]
        size_inches = data["set_fitlim"][peakname]["size_inches"]
        ylim = data["set_fitlim"][peakname]["ylim"]

        # figureを作成
        fig, ax = plt.subplots()
        fig.set_size_inches(size_inches)
        fig.set_dpi(300)
        fig.subplots_adjust(
            left = 0.08,
            right = 0.92,
            bottom = 0.08,
            top = 0.92
        )

        # xデータを読み込み(共通)
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta < theta_range[0]] = False
        mask[theta > theta_range[1]] = False
        fitmask = np.ones(theta.shape).astype(np.bool_)
        fitmask[theta < fit_range[0]] = False
        fitmask[theta > fit_range[1]] = False

        # すべてプロットする
        n_frame = len(data["set_filelist"]["flist"])
        pf = peakfit()
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensity = np.array(f["intensity"]["frame = {}".format(i)][()]) # type: ignore
                ax.plot(
                    theta[mask],
                    (intensity + i*aset)[mask],
                    lw = 0.1,
                    c = "0"
                )
                x = np.linspace(theta[fitmask][0], theta[fitmask][-1], 200)
                y: np.ndarray = pseudoVoigt(
                    x,
                    *[data["autofit"][peakname]["res"][i]["popt"][j] for j in pf.variables()]
                ) # type: ignore
                ax.plot(
                    x,
                    y + i*aset,
                    lw = 0.1,
                    c = "tab:orange"
                )
                ax.plot(
                    [data["autofit"][peakname]["res"][i]["popt"]["mu"]],
                    [
                        data["autofit"][peakname]["res"][i]["popt"]["amp"]
                        + data["autofit"][peakname]["res"][i]["popt"]["b0"]
                        + data["autofit"][peakname]["res"][i]["popt"]["b1"] * data["autofit"][peakname]["res"][i]["popt"]["mu"]
                        + i*aset
                    ],
                    lw = 0,
                    marker = "o",
                    ms = 1,
                    mec = "tab:orange",
                    c = "1",
                    mew = 0.1
                )
                simple_progress_bar(i+1, n_frame)

        # axを構成
        ax.set_xlabel("2theta [degree]", fontsize = 10)
        ax.autoscale(tight = True)
        ax.set_xlim(*theta_range) # type: ignore
        ax.set_ylim(ylim)

        # 画像の表示
        fig.canvas.draw()
        img = im.frombuffer(
            mode = "RGBA",
            size = fig.canvas.get_width_height(),
            data = fig.canvas.buffer_rgba(), # type: ignore
            decoder_name = "raw"
        )
        os.makedirs(cachedir + "/" + peakname, exist_ok=True)
        key = sys._getframe().f_code.co_name
        imgfilename = cachedir + "/{}/{}.png".format(peakname, key)
        img.save(imgfilename)
        logger.debug("[Save fig]: " + os.path.abspath(imgfilename))
        pdffilename = cachedir + "/{}/{}.pdf".format(peakname, key)
        plt.savefig(pdffilename)
        logger.debug("[Save fig]: " + os.path.abspath(pdffilename))
        plt.close()
        display(Image(filename = imgfilename, width = size_inches[0]*100))

    return
plot_res()
del plot_res
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■] 100% (217/217) 
DEBUG      2025-06-27 10:34:22,672 [3622972237.py:95] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\FeH111\plot_res.png
DEBUG      2025-06-27 10:34:22,909 [3622972237.py:98] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\FeH111\plot_res.pdf
No description has been provided for this image

FeH200¶

フィッティング範囲を絞ります。

In [ ]:
def set_fitlim():

    # ピーク名
    peakname = "FeH200"

    # profileの間隔
    aset = 0.1

    # x軸の範囲
    theta_range = (13,14)

    # fittingする範囲
    fit_range = (13.1,13.6)

    # グラフのサイズ
    size_inches = (3,5)

    if True: # Main

        # figureを作成
        fig, ax = plt.subplots()
        fig.set_size_inches(size_inches)
        fig.set_dpi(300)
        fig.subplots_adjust(
            left = 0.08,
            right = 0.92,
            bottom = 0.08,
            top = 0.92
        )

        # xデータを読み込み(共通)
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta < theta_range[0]] = False
        mask[theta > theta_range[1]] = False
        fitmask = np.ones(theta.shape).astype(np.bool_)
        fitmask[theta < fit_range[0]] = False
        fitmask[theta > fit_range[1]] = False

        # すべてプロットする
        n_frame = len(data["set_filelist"]["flist"])
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensity = np.array(f["intensity"]["frame = {}".format(i)][()]) # type: ignore
                ax.plot(
                    theta[mask],
                    (intensity + i*aset)[mask],
                    lw = 0.1,
                    c = "0"
                )
                ax.plot(
                    theta[fitmask],
                    (intensity + i*aset)[fitmask],
                    lw = 0.1,
                    c = "tab:orange"
                )
                simple_progress_bar(i+1, n_frame)

        # axを構成
        ax.set_xlabel("2theta [degree]", fontsize = 10)
        ax.autoscale(tight = True)
        ax.set_xlim(*theta_range) # type: ignore
        ylim = ax.get_ylim()

        # 画像の表示
        fig.canvas.draw()
        img = im.frombuffer(
            mode = "RGBA",
            size = fig.canvas.get_width_height(),
            data = fig.canvas.buffer_rgba(), # type: ignore
            decoder_name = "raw"
        )
        os.makedirs(cachedir + "/{}".format(peakname), exist_ok=True)
        key = sys._getframe().f_code.co_name
        imgfilename = cachedir + "/{}/{}.png".format(peakname, key)
        img.save(imgfilename)
        logger.debug("[Save fig]: " + os.path.abspath(imgfilename))
        pdffilename = cachedir + "/{}/{}.pdf".format(peakname, key)
        plt.savefig(pdffilename)
        logger.debug("[Save fig]: " + os.path.abspath(pdffilename))
        plt.close()
        display(Image(filename = imgfilename, width = size_inches[0]*100))

        # データ格納
        if not key in data.keys():
            data[key] = dict()
        data[key][peakname] = dict()
        data[key][peakname]["theta_range"] = theta_range
        data[key][peakname]["aset"] = aset
        data[key][peakname]["size_inches"] = size_inches
        data[key][peakname]["fit_range"] = fit_range
        data[key][peakname]["ylim"] = ylim
        logger.info("[Add variables]: {}/{}".format(key, peakname))
        dict_tree(data)

    return
set_fitlim()
del set_fitlim
In [ ]:
def autofit():

    peakname = "FeH200"

    if True: # Main
        # 角度データを読み込み
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # 強度データを取得
        n_frame = len(data["set_filelist"]["flist"])
        intensities = list()
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensities.append(np.array(f["intensity"]["frame = {}".format(i)][()])) # type: ignore
        intensities = np.vstack(intensities)

        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta < data["set_fitlim"][peakname]["fit_range"][0]] = False
        mask[theta > data["set_fitlim"][peakname]["fit_range"][1]] = False
        theta_fit = theta[mask]
        intensities_fit = intensities.T[mask].T

        # 出力格納用変数を定義
        res = [None]*n_frame

        # フィット用関数を定義
        pf = peakfit()
        def process(i):
            _res = pf.fit_Vigot_func(theta = theta_fit, intensity = intensities_fit[i])
            res_dict = dict()
            for j, k in enumerate(["popt", "pcov"]):
                res_dict[k] = dict()
                for l, m in enumerate(pf.variables(nop = 1)):
                    res_dict[k][m] = _res[j][l]
            res_dict["r2"] = _res[2]
            return i, res_dict

        # マルチスレッドを使いながら演算
        with confu.ThreadPoolExecutor() as tpe:
            futures = [tpe.submit(process, i_frame) for i_frame in np.arange(n_frame)]
            for i, future in enumerate(confu.as_completed(futures)):
                i_frame, val = future.result()
                res[i_frame] = val # type: ignore
                simple_progress_bar(i+1, n_frame)
        
        # データ格納
        key = sys._getframe().f_code.co_name
        if not key in data.keys():
            data[key] = dict()
        data[key][peakname] = dict()
        data[key][peakname]["res"] = res
        logger.debug("[Add variable]: " + peakname + "/res")
        logger.info("size of data: {} MB".format(sys.getsizeof(data)%1024%1024))

        # データ保存
        os.makedirs(cachedir + "/" + peakname, exist_ok=True)
        jsonfile = cachedir + "/{}/{}.json".format(peakname, key)
        with open(jsonfile, mode = "w") as f:
            json.dump(res, f, indent = 4)
        logger.info("[Save json]: " + os.path.abspath(jsonfile))
        dict_tree(data)

    return
autofit()
del autofit

フィッティング結果を出力します。

In [ ]:
def plot_res():

    peakname = "FeH200"

    if True: # Main

        # 変数を読み込み
        theta_range = data["set_fitlim"][peakname]["theta_range"]
        fit_range = data["set_fitlim"][peakname]["fit_range"]
        aset = data["set_fitlim"][peakname]["aset"]
        size_inches = data["set_fitlim"][peakname]["size_inches"]
        ylim = data["set_fitlim"][peakname]["ylim"]

        # figureを作成
        fig, ax = plt.subplots()
        fig.set_size_inches(size_inches)
        fig.set_dpi(300)
        fig.subplots_adjust(
            left = 0.08,
            right = 0.92,
            bottom = 0.08,
            top = 0.92
        )

        # xデータを読み込み(共通)
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta < theta_range[0]] = False
        mask[theta > theta_range[1]] = False
        fitmask = np.ones(theta.shape).astype(np.bool_)
        fitmask[theta < fit_range[0]] = False
        fitmask[theta > fit_range[1]] = False

        # すべてプロットする
        n_frame = len(data["set_filelist"]["flist"])
        pf = peakfit()
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensity = np.array(f["intensity"]["frame = {}".format(i)][()]) # type: ignore
                ax.plot(
                    theta[mask],
                    (intensity + i*aset)[mask],
                    lw = 0.1,
                    c = "0"
                )
                x = np.linspace(theta[fitmask][0], theta[fitmask][-1], 200)
                y: np.ndarray = pseudoVoigt(
                    x,
                    *[data["autofit"][peakname]["res"][i]["popt"][j] for j in pf.variables()]
                ) # type: ignore
                ax.plot(
                    x,
                    y + i*aset,
                    lw = 0.1,
                    c = "tab:orange"
                )
                ax.plot(
                    [data["autofit"][peakname]["res"][i]["popt"]["mu"]],
                    [
                        data["autofit"][peakname]["res"][i]["popt"]["amp"]
                        + data["autofit"][peakname]["res"][i]["popt"]["b0"]
                        + data["autofit"][peakname]["res"][i]["popt"]["b1"] * data["autofit"][peakname]["res"][i]["popt"]["mu"]
                        + i*aset
                    ],
                    lw = 0,
                    marker = "o",
                    ms = 1,
                    mec = "tab:orange",
                    c = "1",
                    mew = 0.1
                )
                simple_progress_bar(i+1, n_frame)

        # axを構成
        ax.set_xlabel("2theta [degree]", fontsize = 10)
        ax.autoscale(tight = True)
        ax.set_xlim(*theta_range) # type: ignore
        ax.set_ylim(ylim)

        # 画像の表示
        fig.canvas.draw()
        img = im.frombuffer(
            mode = "RGBA",
            size = fig.canvas.get_width_height(),
            data = fig.canvas.buffer_rgba(), # type: ignore
            decoder_name = "raw"
        )
        os.makedirs(cachedir + "/" + peakname, exist_ok=True)
        key = sys._getframe().f_code.co_name
        imgfilename = cachedir + "/{}/{}.png".format(peakname, key)
        img.save(imgfilename)
        logger.debug("[Save fig]: " + os.path.abspath(imgfilename))
        pdffilename = cachedir + "/{}/{}.pdf".format(peakname, key)
        plt.savefig(pdffilename)
        logger.debug("[Save fig]: " + os.path.abspath(pdffilename))
        plt.close()
        display(Image(filename = imgfilename, width = size_inches[0]*100))

    return
plot_res()
del plot_res

KCl200¶

フィッティング範囲を絞ります。

In [19]:
def set_fitlim():

    # ピーク名
    peakname = "KCl200"

    # profileの間隔
    aset = 0.2

    # x軸の範囲
    theta_range = (14,17)

    # fittingする範囲
    fit_range = (14.5,16)

    # グラフのサイズ
    size_inches = (3,5)

    if True: # Main

        # figureを作成
        fig, ax = plt.subplots()
        fig.set_size_inches(size_inches)
        fig.set_dpi(300)
        fig.subplots_adjust(
            left = 0.08,
            right = 0.92,
            bottom = 0.08,
            top = 0.92
        )

        # xデータを読み込み(共通)
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta < theta_range[0]] = False
        mask[theta > theta_range[1]] = False
        fitmask = np.ones(theta.shape).astype(np.bool_)
        fitmask[theta < fit_range[0]] = False
        fitmask[theta > fit_range[1]] = False

        # すべてプロットする
        n_frame = len(data["set_filelist"]["flist"])
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensity = np.array(f["intensity"]["frame = {}".format(i)][()]) # type: ignore
                ax.plot(
                    theta[mask],
                    (intensity + i*aset)[mask],
                    lw = 0.1,
                    c = "0"
                )
                ax.plot(
                    theta[fitmask],
                    (intensity + i*aset)[fitmask],
                    lw = 0.1,
                    c = "tab:orange"
                )
                simple_progress_bar(i+1, n_frame)

        # axを構成
        ax.set_xlabel("2theta [degree]", fontsize = 10)
        ax.autoscale(tight = True)
        ax.set_xlim(*theta_range) # type: ignore
        ylim = ax.get_ylim()

        # 画像の表示
        fig.canvas.draw()
        img = im.frombuffer(
            mode = "RGBA",
            size = fig.canvas.get_width_height(),
            data = fig.canvas.buffer_rgba(), # type: ignore
            decoder_name = "raw"
        )
        os.makedirs(cachedir + "/{}".format(peakname), exist_ok=True)
        key = sys._getframe().f_code.co_name
        imgfilename = cachedir + "/{}/{}.png".format(peakname, key)
        img.save(imgfilename)
        logger.debug("[Save fig]: " + os.path.abspath(imgfilename))
        pdffilename = cachedir + "/{}/{}.pdf".format(peakname, key)
        plt.savefig(pdffilename)
        logger.debug("[Save fig]: " + os.path.abspath(pdffilename))
        plt.close()
        display(Image(filename = imgfilename, width = size_inches[0]*100))

        # データ格納
        if not key in data.keys():
            data[key] = dict()
        data[key][peakname] = dict()
        data[key][peakname]["theta_range"] = theta_range
        data[key][peakname]["aset"] = aset
        data[key][peakname]["size_inches"] = size_inches
        data[key][peakname]["fit_range"] = fit_range
        data[key][peakname]["ylim"] = ylim
        logger.info("[Add variables]: {}/{}".format(key, peakname))
        dict_tree(data)

    return
set_fitlim()
del set_fitlim
Progress: [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■] 100% (217/217) 
DEBUG      2025-06-27 10:35:06,570 [2992753780.py:80] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\KCl200\set_fitlim.png
DEBUG      2025-06-27 10:35:06,908 [2992753780.py:83] [Save fig]: c:\Users\okaza\pythonenv\fpd\fitting_csv\.cache\KCl200\set_fitlim.pdf
No description has been provided for this image
INFO       2025-06-27 10:35:06,924 [2992753780.py:96] [Add variables]: set_fitlim/KCl200
├── set_filelist
│   ├── dir <class 'str'>
│   ├── flist <class 'list'>
│   ├── header <class 'str'>
│   └── footer <class 'str'>
├── convertCSV2HDF
│   └── hdf <class 'str'>
├── set_fitlim
│   ├── KCl110
│   │   ├── theta_range <class 'tuple'>
│   │   ├── aset <class 'int'>
│   │   ├── size_inches <class 'tuple'>
│   │   ├── fit_range <class 'tuple'>
│   │   └── ylim <class 'tuple'>
│   ├── FeH111
│   │   ├── theta_range <class 'tuple'>
│   │   ├── aset <class 'float'>
│   │   ├── size_inches <class 'tuple'>
│   │   ├── fit_range <class 'tuple'>
│   │   └── ylim <class 'tuple'>
│   └── KCl200
│       ├── theta_range <class 'tuple'>
│       ├── aset <class 'float'>
│       ├── size_inches <class 'tuple'>
│       ├── fit_range <class 'tuple'>
│       └── ylim <class 'tuple'>
└── autofit
    ├── KCl110
    │   └── res <class 'list'>
    └── FeH111
        └── res <class 'list'>
In [ ]:
def autofit():

    peakname = "KCl200"

    if True: # Main
        # 角度データを読み込み
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # 強度データを取得
        n_frame = len(data["set_filelist"]["flist"])
        intensities = list()
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensities.append(np.array(f["intensity"]["frame = {}".format(i)][()])) # type: ignore
        intensities = np.vstack(intensities)

        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta < data["set_fitlim"][peakname]["fit_range"][0]] = False
        mask[theta > data["set_fitlim"][peakname]["fit_range"][1]] = False
        theta_fit = theta[mask]
        intensities_fit = intensities.T[mask].T

        # 出力格納用変数を定義
        res = [None]*n_frame

        # フィット用関数を定義
        pf = peakfit()
        def process(i):
            _res = pf.fit_Vigot_func(theta = theta_fit, intensity = intensities_fit[i])
            res_dict = dict()
            for j, k in enumerate(["popt", "pcov"]):
                res_dict[k] = dict()
                for l, m in enumerate(pf.variables(nop = 1)):
                    res_dict[k][m] = _res[j][l]
            res_dict["r2"] = _res[2]
            return i, res_dict

        # マルチスレッドを使いながら演算
        with confu.ThreadPoolExecutor() as tpe:
            futures = [tpe.submit(process, i_frame) for i_frame in np.arange(n_frame)]
            for i, future in enumerate(confu.as_completed(futures)):
                i_frame, val = future.result()
                res[i_frame] = val # type: ignore
                simple_progress_bar(i+1, n_frame)
        
        # データ格納
        key = sys._getframe().f_code.co_name
        if not key in data.keys():
            data[key] = dict()
        data[key][peakname] = dict()
        data[key][peakname]["res"] = res
        logger.debug("[Add variable]: " + peakname + "/res")
        logger.info("size of data: {} MB".format(sys.getsizeof(data)%1024%1024))

        # データ保存
        os.makedirs(cachedir + "/" + peakname, exist_ok=True)
        jsonfile = cachedir + "/{}/{}.json".format(peakname, key)
        with open(jsonfile, mode = "w") as f:
            json.dump(res, f, indent = 4)
        logger.info("[Save json]: " + os.path.abspath(jsonfile))
        dict_tree(data)

    return
autofit()
del autofit

フィッティング結果を出力します。

In [ ]:
def plot_res():

    peakname = "KCl200"

    if True: # Main

        # 変数を読み込み
        theta_range = data["set_fitlim"][peakname]["theta_range"]
        fit_range = data["set_fitlim"][peakname]["fit_range"]
        aset = data["set_fitlim"][peakname]["aset"]
        size_inches = data["set_fitlim"][peakname]["size_inches"]
        ylim = data["set_fitlim"][peakname]["ylim"]

        # figureを作成
        fig, ax = plt.subplots()
        fig.set_size_inches(size_inches)
        fig.set_dpi(300)
        fig.subplots_adjust(
            left = 0.08,
            right = 0.92,
            bottom = 0.08,
            top = 0.92
        )

        # xデータを読み込み(共通)
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            theta = np.array(f["2theta"][()]) # type: ignore
        
        # mask処理
        mask = np.ones(theta.shape).astype(np.bool_)
        mask[theta < theta_range[0]] = False
        mask[theta > theta_range[1]] = False
        fitmask = np.ones(theta.shape).astype(np.bool_)
        fitmask[theta < fit_range[0]] = False
        fitmask[theta > fit_range[1]] = False

        # すべてプロットする
        n_frame = len(data["set_filelist"]["flist"])
        pf = peakfit()
        with h5py.File(data["convertCSV2HDF"]["hdf"], mode = "r") as f:
            for i in range(n_frame):
                intensity = np.array(f["intensity"]["frame = {}".format(i)][()]) # type: ignore
                ax.plot(
                    theta[mask],
                    (intensity + i*aset)[mask],
                    lw = 0.1,
                    c = "0"
                )
                x = np.linspace(theta[fitmask][0], theta[fitmask][-1], 200)
                y: np.ndarray = pseudoVoigt(
                    x,
                    *[data["autofit"][peakname]["res"][i]["popt"][j] for j in pf.variables()]
                ) # type: ignore
                ax.plot(
                    x,
                    y + i*aset,
                    lw = 0.1,
                    c = "tab:orange"
                )
                ax.plot(
                    [data["autofit"][peakname]["res"][i]["popt"]["mu"]],
                    [
                        data["autofit"][peakname]["res"][i]["popt"]["amp"]
                        + data["autofit"][peakname]["res"][i]["popt"]["b0"]
                        + data["autofit"][peakname]["res"][i]["popt"]["b1"] * data["autofit"][peakname]["res"][i]["popt"]["mu"]
                        + i*aset
                    ],
                    lw = 0,
                    marker = "o",
                    ms = 1,
                    mec = "tab:orange",
                    c = "1",
                    mew = 0.1
                )
                simple_progress_bar(i+1, n_frame)

        # axを構成
        ax.set_xlabel("2theta [degree]", fontsize = 10)
        ax.autoscale(tight = True)
        ax.set_xlim(*theta_range) # type: ignore
        ax.set_ylim(ylim)

        # 画像の表示
        fig.canvas.draw()
        img = im.frombuffer(
            mode = "RGBA",
            size = fig.canvas.get_width_height(),
            data = fig.canvas.buffer_rgba(), # type: ignore
            decoder_name = "raw"
        )
        os.makedirs(cachedir + "/" + peakname, exist_ok=True)
        key = sys._getframe().f_code.co_name
        imgfilename = cachedir + "/{}/{}.png".format(peakname, key)
        img.save(imgfilename)
        logger.debug("[Save fig]: " + os.path.abspath(imgfilename))
        pdffilename = cachedir + "/{}/{}.pdf".format(peakname, key)
        plt.savefig(pdffilename)
        logger.debug("[Save fig]: " + os.path.abspath(pdffilename))
        plt.close()
        display(Image(filename = imgfilename, width = size_inches[0]*100))

    return
plot_res()
del plot_res